package com.shop.cereshop.app.service.wallet;

import com.baomidou.mybatisplus.extension.service.IService;
import com.shop.cereshop.app.domain.wallet.UserIncomeAndExpenseDTO;
import com.shop.cereshop.commons.domain.versions.AppVersions;
import com.shop.cereshop.commons.domain.wallet.BuyerWallet;
import com.shop.cereshop.app.param.wallet.WalletInfoVO;
import com.shop.cereshop.app.param.wallet.WalletTransactionQueryVO;
import com.shop.cereshop.app.param.wallet.WalletTransactionVO;
import com.shop.cereshop.app.param.wallet.WalletInitResult;
import com.shop.cereshop.app.param.wallet.WalletPayCheckResult;
import com.shop.cereshop.app.param.wallet.WalletPayExecuteResult;
import com.shop.cereshop.commons.constant.WalletConstant;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 用户钱包服务接口
 *
 * @author wang.yao
 * @date 2025-08-26
 */
public interface BuyerWalletService extends IService<BuyerWallet> {

    /**
     * 获取用户钱包信息
     *
     * @param buyerUserId 用户ID
     * @return 钱包信息VO
     */
    WalletInfoVO getWalletInfo(Long buyerUserId);

    /**
     * 初始化用户钱包
     *
     * @param buyerUserId 用户ID
     * @return 初始化结果，包含是否新建和钱包信息
     */
    WalletInitResult initWallet(Long buyerUserId);

    /**
     * 检查用户钱包是否存在，不存在则创建
     *
     * @param buyerUserId 用户ID
     * @return 钱包信息
     */
    BuyerWallet getOrCreateWallet(Long buyerUserId);

    /**
     * 设置支付密码
     *
     * @param buyerUserId 用户ID
     * @param payPassword 支付密码
     * @param ipAddress   IP地址
     * @return 设置结果
     */
    WalletConstant.PayPasswordSetResult setPayPassword(Long buyerUserId, String payPassword, String ipAddress);

    /**
     * 修改支付密码
     *
     * @param buyerUserId 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @param ipAddress   IP地址
     * @return 修改结果
     */
    WalletConstant.PayPasswordModifyResult modifyPayPassword(Long buyerUserId, String oldPassword, String newPassword, String ipAddress);

    /**
     * 验证支付密码
     *
     * @param buyerUserId 用户ID
     * @param payPassword 支付密码
     * @param ipAddress   IP地址
     * @return 是否验证成功
     */
    boolean verifyPayPassword(Long buyerUserId, String payPassword, String ipAddress);

    /**
     * 重置支付密码
     *
     * @param buyerUserId 用户ID
     * @param smsCode     短信验证码
     * @param newPassword 新密码
     * @param ipAddress   IP地址
     * @return 是否成功
     */
    boolean resetPayPassword(Long buyerUserId, String smsCode, String newPassword, String ipAddress);

    /**
     * 检查支付密码是否被锁定
     *
     * @param buyerUserId 用户ID
     * @return 是否锁定
     */
    boolean isPayPasswordLocked(Long buyerUserId);

    /**
     * 获取剩余锁定时间
     *
     * @param buyerUserId 用户ID
     * @return 剩余锁定时间(分钟)
     */
    long getRemainingLockTime(Long buyerUserId);

    /**
     * 更新钱包余额
     *
     * @param buyerUserId     用户ID
     * @param amount          金额变动
     * @param transactionType 交易类型
     * @param orderId         关联订单号
     * @param description     交易描述
     * @return 是否成功
     */
    boolean updateBalance(Long buyerUserId, BigDecimal amount, Integer transactionType, String orderId, String description);

    /**
     * 钱包消费
     *
     * @param buyerUserId 用户ID
     * @param amount      消费金额
     * @param consumeType 消费类型
     * @param description 消费描述
     * @param orderNo     关联订单号
     * @param payPassword 支付密码
     * @param ipAddress   IP地址
     * @return 是否成功
     */
    boolean consume(Long buyerUserId, BigDecimal amount, Integer consumeType, String description, String orderNo, String payPassword, String ipAddress);

    /**
     * 查询钱包流水列表
     *
     * @param buyerUserId 用户ID
     * @param queryVO     查询参数
     * @return 流水列表
     */
    List<WalletTransactionVO> getTransactionList(Long buyerUserId, WalletTransactionQueryVO queryVO);

    /**
     * 获取用户收入和支出
     *
     * @param buyerUserId 用户ID
     * @param startDate   开始时间
     * @param endDate     结束时间
     * @return 收入和支出
     */
    UserIncomeAndExpenseDTO getUserIncomeAndExpense(Long buyerUserId, String startDate, String endDate);

    /**
     * 查询钱包流水详情
     *
     * @param transactionId 流水ID
     * @return 流水详情
     */
    WalletTransactionVO getTransactionDetail(Long transactionId);

    /**
     * 检查钱包余额是否足够支付订单
     *
     * @param buyerUserId 用户ID
     * @param orderId     订单ID
     * @param orderType   订单类型 1-父订单 2-子订单
     * @param collageId   拼团ID
     * @return 检查结果
     */
    WalletPayCheckResult checkWalletBalanceForPay(Long buyerUserId, Long orderId, Integer orderType, Long collageId);

    /**
     * 执行钱包支付
     *
     * @param buyerUserId 用户ID
     * @param orderId     订单ID
     * @param orderType   订单类型 1-父订单 2-子订单
     * @param collageId   拼团ID
     * @param payPassword 支付密码
     * @param ipAddress   IP地址
     * @return 支付结果
     */
    WalletPayExecuteResult executeWalletPay(Long buyerUserId, Long orderId, Integer orderType, Long collageId, String payPassword, String ipAddress);
}
